package com.ruoyi.file.utils;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class PdfToImageUtil {

    /**
     * 将 PDF 的第一页转换为 PNG 图片字节数组
     * @param pdfInputStream PDF文件的输入流，不能为 null
     * @return 第一页图片（PNG格式）的字节数组
     * @throws IOException 若 PDF 无效或读取/转换失败
     */
    public static byte[] pdfFirstPageToImage1(InputStream pdfInputStream) throws IOException {
        if (pdfInputStream == null) {
            throw new IllegalArgumentException("pdfInputStream cannot be null");
        }
        // try-with-resources 自动关闭资源
        try (PDDocument document = PDDocument.load(pdfInputStream);
             ByteArrayOutputStream imageOut = new ByteArrayOutputStream()) {
            PDFRenderer renderer = new PDFRenderer(document);
            BufferedImage image = renderer.renderImageWithDPI(0, 150); // 仅转换第一页
            ImageIO.write(image, "png", imageOut);
            return imageOut.toByteArray();
        }
    }



    /**
     * 将 PDF 的第一页转换为 PNG 图片字节数组，并裁剪为顶部的前三分之一
     * @param pdfInputStream PDF文件的输入流，不能为 null
     * @return 第一页前三分之一图片（PNG格式）的字节数组
     * @throws IOException 若 PDF 无效或读取/转换失败
     */
    public static byte[] pdfFirstPageToImage(InputStream pdfInputStream) throws IOException {
        if (pdfInputStream == null) {
            throw new IllegalArgumentException("pdfInputStream cannot be null");
        }
        // try-with-resources 自动关闭资源
        try (PDDocument document = PDDocument.load(pdfInputStream);
             ByteArrayOutputStream imageOut = new ByteArrayOutputStream()) {
            PDFRenderer renderer = new PDFRenderer(document);
            BufferedImage image = renderer.renderImageWithDPI(0, 150); // 仅转换第一页
            // 裁剪为前三分之一
            int width = image.getWidth();
            int height = image.getHeight();
            int thirdHeight = height / 3;
            BufferedImage cropped = image.getSubimage(0, 0, width, thirdHeight);
            ImageIO.write(cropped, "png", imageOut);
            return imageOut.toByteArray();
        }
    }
}